/**
 * @RouteRecordNormalized 定义此记录是否是另一个记录的别名。如果该记录是原始记录，则此属性为 undefined
 */
import type { RouteRecordNormalized } from 'vue-router';

/**
 *  vite 不能使用require.context 自动导入 modules 使用 import.meta.globEager 替换
 *  @param modules 读取本地路由文件
 */
const modules = import.meta.glob('./modules/*.ts', { eager: true });
/**
 * @exports formatModules 载入路由的方法
 * @param _modules 传入的modules数据
 * @param result 传入的result的数据
 * @returns 返回路由数组
 */
const formatModules = (_modules: any, result: RouteRecordNormalized[]) => {
  Object.keys(_modules).forEach((key) => {
    // console.log(_modules[key].default)
    const defaultModule = _modules[key].default;
    if (!defaultModule) return;
    /**
     * ES6 Array.isArray() 用于确定传递的值是否是一个 Array。
     */
    const moduleList = Array.isArray(defaultModule) ? [...defaultModule] : [defaultModule];
    result.push(...moduleList);
  });
  return sortBubble(result);
};

/**
 * @funtion sortBubble 冒泡排序
 * @param param
 */
const sortBubble = (param?: any) => {
  const len = param.length;
  for (let a = 0; a <= param.length - 1; a++) {
    for (let i = 0; i < len - 1; i++) {
      // 内层循环:一轮排序下,遍历待排数列进行比较和交换
      for (let j = 0; j < len - 1 - i; j++) {
        // 前面的数大于后面的数,则交换
        if (param[j].meta.serialNumber > param[j + 1].meta.serialNumber) {
          swap(param, j, j + 1);
        }
      }
    }
  }
  return param;
};

/**
 * @swap 交换方法
 * @param arr
 * @param i
 * @param j
 */
const swap = (arr: any, i: any, j: any) => {
  const temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
};

/**
 * @appRoutes 导出本地路由数组
 */
export const appRoutes: RouteRecordNormalized[] = formatModules(modules, []);
